﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "IObject.h"

namespace gcmp
{
    class ElementId;
    class IGraphicsElementShape;
    class IGraphicsStyleData;
    class IGdcLinkModelViewManager;
    class Vector3d;

    static const std::wstring g_scaleExtraData = L"scale"; ///<  扩展数据对应的比例
    static const std::wstring g_InterProfessionalExtraData = L"interProfessionalLinkModelView";///<  扩展数据对应的嵌套链接视图扩展数据

    /// \brief 链接视图信息
    struct GCMP_MODEL_INTERFACE_EXPORT GdcLinkModelViewInfo
    {
        std::wstring HostDatasetId;          ///<  主工作单元Id
        Int32 HostDatasetVersion;            ///<  链接模型对象的工作单元版本
        std::wstring DatasetId;          ///<  链接模型对象的工作单元Id
        Int32 DatasetVersion;            ///<  链接模型对象的工作单元版本
        ElementId LinkDocumentElementId;  ///<  链接模型对象id
        ElementId LinkModelViewId;        ///<  链接模型对象的链接视图id,为-1表示链接模型
        std::wstring LinkModelViewName;   ///<  链接模型对象的链接视图的名字，链接模型是字符串为空
        OwnerPtr<GdcLinkModelViewInfo> LinkModelViewInfo; ///<  嵌套链接的视图信息 
     
        GdcLinkModelViewInfo(const std::wstring& datasetIdHost, Int32 datasetVersionHost, const std::wstring& datasetId, Int32 datasetVersion, const ElementId& linkDocEleId, const ElementId& linkModelViewId, const std::wstring& linkModelViewName, OwnerPtr<GdcLinkModelViewInfo> linkModelViewInfo);

        /// \brief 从链接视图的扩展数据准换成链接视图信息
        /// \param linkModelViewExtraData 扩展数据
        /// \return 链接视图信息
        static OwnerPtr<GdcLinkModelViewInfo> ToInfo(const std::wstring& linkModelViewExtraData);

        /// \brief 从链接视图信息转换成链接视图的扩展数据
        /// \param info 链接视图信息指针
        /// \return 链接视图的扩展数据
        static std::wstring ToExtraData(const GdcLinkModelViewInfo* info);

        /// \brief 从链接视图信息转获取其所属工作单元，比如B链接A，B上传时，这里返回的是B的工作单元
        /// \param info 链接视图信息指针
        /// \return 工作单元字符串
        static std::wstring GetOwnerDatasetId(const GdcLinkModelViewInfo* info);

        /// \brief 从链接视图信息转获取其来源工作单元，比如B链接A，B上传时，这里返回的是A的工作单元
        /// \param info 链接视图信息指针
        /// \return 工作单元字符串
        static std::wstring GetSourceDatasetId(const GdcLinkModelViewInfo* info);
    };


    /// \brief 链接视图对象接口
    class GCMP_MODEL_INTERFACE_EXPORT IGdcLinkModelView : public IObject
    {
        DEFINE_CAST_DERIVED(IGdcLinkModelView, IObject)
    public:
        ~IGdcLinkModelView();
        
        /// \brief 是否是默认三维视图
        /// \return true - 是默认三维视图，false - 不是
        virtual bool IsDefault3DView() const = 0;

        /// \brief 获取链接视图的Id
        /// \return 链接视图的Id
        virtual const ElementId& GetModelViewId() const = 0;

        /// \brief 获取链接视图的名字
        /// \return 链接视图的名字
        virtual const std::wstring& GetModelViewName() const = 0;

        /// \brief 获取链接视图原点
        /// \return 链接视图原点
        virtual Vector3d GetModelViewOrigin() const = 0;

        /// \brief 获取定制视图类型
        /// \return 定制视图类型
        virtual const std::wstring& GetUserDataId() const = 0;

        /// \brief 获取链接视图的MetaData，包含视图名称和视图的ElementId，Json格式如下
        ///                 {"modelViewId":"",
        ///                  "modelViewName":""}
        /// \return 链接视图的MetaData
        virtual std::string GetMetaData() const = 0;

        /// \brief 获取补充数据
        /// \return 补充数据
        virtual const std::map<std::wstring, std::wstring>& GetExtraData() const = 0;

        /// \brief 设置补充数据, 需要删除的接口，勿用
        /// \return true 成功，false 失败
        virtual bool SetExtraData(const std::map<std::wstring, std::wstring>& extraData) = 0;

        /// \brief 获取链接视图中的某个元素的图形表达
        /// \param id 元素的ElementId
        /// \return 元素的图形表达
        virtual const IGraphicsElementShape* GetModelViewElementShape(const ElementId& id) const = 0;

        /// \brief 获取链接视图中的某个图形节点的对象样式数据
        /// \param nodePath 图形节点的完整路径
        /// \return 对象样式数据
        virtual OwnerPtr<IGraphicsStyleData> GetGraphicsStyleData(const std::wstring& nodePath) const = 0;

        /// \brief 获取链接视图中的某个图形节点的对象样式数据对应的索引值
        /// \param nodePath 图形节点的完整路径
        /// \return 对象样式数据对应的索引值
        virtual size_t GetGraphicsStyleDataIndex(const std::wstring& nodePath) const = 0;

        /// \brief 更新链接视图中图形和样式数据
        /// \param bForceGenerateModelViewElementShapes 是否强制生成视图图形节点
        /// \param needsRegenerateModelViewElementShapes 是否需要生成视图图形节点，只有改参数为true时，第一个参数才生效
        /// \return true - 成功；false - 失败
        virtual bool Update(bool bForceGenerateModelViewElementShapes, bool needsRegenerateModelViewElementShapes) = 0;

        /// \brief 获取链接视图管理器接口
        /// \return 链接视图管理器接口
        virtual const IGdcLinkModelViewManager* GetLinkModelViewManager() const = 0;

        /// \brief 清理数据
        /// \return 
        virtual void Clear() = 0;
    };
}
